package com.starrocks.controller;

import com.starrocks.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 数据库元数据查询控制器
 * 提供表名和字段查询接口
 */
@Slf4j
@RestController
@RequestMapping("/api/meta")
public class DatabaseMetaController {

    @Autowired
    @Qualifier("starrocksJdbcTemplate")
    private JdbcTemplate starrocksJdbcTemplate;

    @Autowired
    @Qualifier("tidbJdbcTemplate")
    private JdbcTemplate tidbJdbcTemplate;

    /**
     * 查询 StarRocks 所有表（包含备注）
     */
    @GetMapping("/starrocks/tables")
    public Result<List<Map<String, String>>> getStarRocksTables() {
        try {
            // 使用 SHOW TABLE STATUS 获取表信息（包含备注）
            String sql = "SHOW TABLE STATUS";
            List<Map<String, Object>> tables = starrocksJdbcTemplate.queryForList(sql);
            
            List<Map<String, String>> tableList = new ArrayList<>();
            for (Map<String, Object> row : tables) {
                Map<String, String> tableInfo = new HashMap<>();
                Object tableName = row.get("Name");
                Object comment = row.get("Comment");
                
                if (tableName != null) {
                    tableInfo.put("name", tableName.toString());
                    tableInfo.put("comment", comment != null ? comment.toString() : "");
                    tableList.add(tableInfo);
                }
            }
            
            log.info("查询到 StarRocks 表数量：{}", tableList.size());
            return Result.success(tableList);
        } catch (Exception e) {
            log.error("查询 StarRocks 表列表失败", e);
            return Result.error("查询失败：" + e.getMessage());
        }
    }

    /**
     * 查询 StarRocks 表的所有字段（包含备注）
     */
    @GetMapping("/starrocks/columns/{tableName}")
    public Result<List<Map<String, String>>> getStarRocksColumns(@PathVariable String tableName) {
        try {
            // 使用 SHOW FULL COLUMNS 获取完整的字段信息（包含备注）
            String sql = "SHOW FULL COLUMNS FROM " + tableName;
            List<Map<String, Object>> columns = starrocksJdbcTemplate.queryForList(sql);
            
            List<Map<String, String>> columnList = new ArrayList<>();
            for (Map<String, Object> row : columns) {
                Map<String, String> columnInfo = new HashMap<>();
                // SHOW FULL COLUMNS 返回：Field, Type, Collation, Null, Key, Default, Extra, Privileges, Comment
                columnInfo.put("name", row.get("Field") != null ? row.get("Field").toString() : "");
                columnInfo.put("type", row.get("Type") != null ? row.get("Type").toString() : "");
                columnInfo.put("key", row.get("Key") != null ? row.get("Key").toString() : "");
                columnInfo.put("comment", row.get("Comment") != null ? row.get("Comment").toString() : "");
                columnInfo.put("nullable", row.get("Null") != null ? row.get("Null").toString() : "");
                columnInfo.put("default", row.get("Default") != null ? row.get("Default").toString() : "");
                columnList.add(columnInfo);
            }
            
            log.info("查询到 StarRocks 表 {} 的字段数量：{}", tableName, columnList.size());
            return Result.success(columnList);
        } catch (Exception e) {
            log.error("查询 StarRocks 表 {} 字段失败", tableName, e);
            return Result.error("查询失败：" + e.getMessage());
        }
    }

    /**
     * 查询 TiDB 所有表（包含备注）
     */
    @GetMapping("/tidb/tables")
    public Result<List<Map<String, String>>> getTiDBTables() {
        try {
            // 使用 SHOW TABLE STATUS 获取表信息（包含备注）
            String sql = "SHOW TABLE STATUS";
            List<Map<String, Object>> tables = tidbJdbcTemplate.queryForList(sql);
            
            List<Map<String, String>> tableList = new ArrayList<>();
            for (Map<String, Object> row : tables) {
                Map<String, String> tableInfo = new HashMap<>();
                Object tableName = row.get("Name");
                Object comment = row.get("Comment");
                
                if (tableName != null) {
                    tableInfo.put("name", tableName.toString());
                    tableInfo.put("comment", comment != null ? comment.toString() : "");
                    tableList.add(tableInfo);
                }
            }
            
            log.info("查询到 TiDB 表数量：{}", tableList.size());
            return Result.success(tableList);
        } catch (Exception e) {
            log.error("查询 TiDB 表列表失败", e);
            return Result.error("查询失败：" + e.getMessage());
        }
    }

    /**
     * 查询 TiDB 表的所有字段（包含备注）
     */
    @GetMapping("/tidb/columns/{tableName}")
    public Result<List<Map<String, String>>> getTiDBColumns(@PathVariable String tableName) {
        try {
            // 使用 SHOW FULL COLUMNS 获取完整的字段信息（包含备注）
            String sql = "SHOW FULL COLUMNS FROM " + tableName;
            List<Map<String, Object>> columns = tidbJdbcTemplate.queryForList(sql);
            
            List<Map<String, String>> columnList = new ArrayList<>();
            for (Map<String, Object> row : columns) {
                Map<String, String> columnInfo = new HashMap<>();
                // SHOW FULL COLUMNS 返回：Field, Type, Collation, Null, Key, Default, Extra, Privileges, Comment
                columnInfo.put("name", row.get("Field") != null ? row.get("Field").toString() : "");
                columnInfo.put("type", row.get("Type") != null ? row.get("Type").toString() : "");
                columnInfo.put("key", row.get("Key") != null ? row.get("Key").toString() : "");
                columnInfo.put("comment", row.get("Comment") != null ? row.get("Comment").toString() : "");
                columnInfo.put("nullable", row.get("Null") != null ? row.get("Null").toString() : "");
                columnInfo.put("default", row.get("Default") != null ? row.get("Default").toString() : "");
                columnList.add(columnInfo);
            }
            
            log.info("查询到 TiDB 表 {} 的字段数量：{}", tableName, columnList.size());
            return Result.success(columnList);
        } catch (Exception e) {
            log.error("查询 TiDB 表 {} 字段失败", tableName, e);
            return Result.error("查询失败：" + e.getMessage());
        }
    }
}
